/*
    1、保留着JS的语法定义方式
    2、ts 限制了变量的取值类型
        + 在定义变量时如果没有描述变量类型，
          ts会将变量的第一个取值类型限制为变量类型
        + 在定义变量时，可以直接指定类型，
          类型一旦限制完成，该变量只能区对于类型数据
*/
var title = "tom";
var title = "aaa";
title = "cccc";
// title = 123;

let age = 23;
age = 33;
// let age = 44;
// age = "字符串";

const SEX = "男";
// const SEX = "女";
// SEX = "女";

var arg1:string = "123";
// arg1 = true;
arg1 = null;

/*
    number
    string
    boolean
    any  TS语法扩展的类型，描述变量可取任意类型数据
         TS 对 JS 语法变量的一种特性保留
    null TS 对于 JS 语法中 typeof null 返回 object 的 bug修复
          null 类型的取值 只有 null
          null 值在TS 中可以为任意 类型变量赋值
    undefined TS 对 JS undefined 类型的保留
          常用于描述方法返回结果状态

    定长数组定义==元组
        变量修饰符 变量名:[类型,类型,类型] = 变量取值;
    数据类型数组定义
        变量修饰符 变量名:类型[] = 变量取值;
        变量修饰符 变量名:Array<类型> = 变量取值; => 泛型定义
    枚举类型
        固定取值范围数据
        被没有修饰的变量，只能在上述范围了进行值的定义
*/
var arg2:any = "dasd";
arg2 = 123;
arg2 = true;

var arg3:null = null;
// arg3 = 123;
var arg4:undefined = undefined;
// arg4 = 123;
// var arg5:string = undefined;

// var arr1:[] = [1];
var arr2:[string,number,boolean] = ["123",123,false];

var arr3:number[] = [1,2,3,4,5,6];
var arr4:Array<string> = ["a","b"];

var arr5:[any,any,any] = [1,"aa",true];
var arr6:any[] = [1,"aa",false];
var arr7:Array<any> = [1,"aa",true];
var arr8:Array<Array<string>> = [["a"],["b"]];

// 1、定义枚举类型数据范围
//  enum 枚举类型名称 { 定义枚举取值 }
// 在项目开发之处，为整个项目统一定义 相关变量的取值范围
enum season {
    spring,
    summer,
    autumn,
    winter
};

var enum1:season = season.spring;

enum seasonA {
    spring="春",
    summer="夏",
    autumn="秋",
    winter="冬"
};
var enum2:seasonA = seasonA.spring;
enum2 = seasonA.autumn;
// 程序员A   0  1  2
// 程序员B   m  f  u
// 程序员C   男 女 未知   

var msg1:string = "aa";
var num1:number = 123;

var message:any = null;

// 在一些特定阶段 告知 编辑器 当前数据类型为何种类型
// ==> 断言 : 在现阶段当前变量以何种类型进行处理
message = "字符串";
(message as string).length;

message = 123;
(<number>message).toFixed(2);

